from sxl import Workbook
from typing import List


class FirstRowReader:
    """
    Excel文件表头读取器，基于sxl库实现，高效处理大型xlsx文件
    特别适合读取超大型Excel文件的表头信息，性能远优于传统库
    """
    
    def __init__(self, xlsx_path: str):
        """
        初始化读取器并加载Excel文件
        
        Args:
            xlsx_path: Excel文件路径
        """
        self.xlsx_path = xlsx_path
        # 初始化工作簿，sxl采用延迟加载机制，此处不会立即加载全部数据
        self.wb = Workbook(xlsx_path)
    
    def read_header_by_sheetname(self, sheet_name: str) -> List[str]:
        """
        读取指定sheet的第一行数据，转换为字符串类型
        
        Args:
            sheet_name: 工作表名称
            
        Returns:
            list: 第一行数据列表，所有元素均为字符串类型
        """
        try:
            # 获取指定工作表
            sheet = self.wb.sheets[sheet_name]
            # 读取第一行数据（head(1)返回包含一行数据的列表）
            first_row = sheet.head(1)
            # 如果存在数据行则转换为字符串列表，否则返回空列表
            if first_row:
                return [str(cell) if cell is not None else "" for cell in first_row[0]]
            return []
        except KeyError:
            raise ValueError(f"工作表 '{sheet_name}' 不存在于文件中")
        except Exception as e:
            raise RuntimeError(f"读取工作表 '{sheet_name}' 时发生错误: {str(e)}")
    
    def read_lastheader(self) -> List[str]:
        """
        读取最后一个sheet的第一行数据
        
        Returns:
            list: 第一行数据列表，所有元素均为字符串类型
        """
        try:
            # 获取指定工作表
            number_keys = [key for key in self.wb.sheets.keys() if isinstance(key, int)]
            sheet_index = max(number_keys)
            sheet = self.wb.sheets[sheet_index]
            # 读取第一行数据（head(1)返回包含一行数据的列表）
            first_row = sheet.head(1)
            # 如果存在数据行则转换为字符串列表，否则返回空列表
            if first_row:
                return [str(cell) if cell is not None else "" for cell in first_row[0]]
            return []
        except Exception as e:
            raise RuntimeError(f"读取最后一个工作表 时发生错误: {str(e)}")

# 测试代码
if __name__ == "__main__":
    import time
    
    # 替换为你的大型Excel文件路径
    excel_path = r"D:\\数据\\大型xlsx文件\\30_2_P37-SOH测试__20240915204118000_P37.xlsx"
    
    try:
        # 记录初始化时间
        start_time = time.time()
        
        # 创建读取器实例
        reader = FirstRowReader(excel_path)
        
        init_time = time.time() - start_time
        print(f"初始化耗时: {init_time:.4f}秒")

        
        # 读取最后一个工作表的表头
        start_time = time.time()
        last_sheet_header = reader.read_lastheader()
        read_time = time.time() - start_time
        
        print(f"\n最后一个工作表的表头（读取耗时: {read_time:.4f}秒）:")
        print(last_sheet_header)
        
        # 示例：读取指定工作表的表头
        # if reader.get_sheet_count() > 0:
        #     first_sheet_name = reader.get_sheet_names()[0]
        #     first_header = reader.readheader_by_sheet_name(first_sheet_name)
        #     print(f"\n工作表 '{first_sheet_name}' 的表头:")
        #     print(first_header)
            
    except Exception as e:
        print(f"发生错误: {str(e)}")
